package com.itheima.waitnotify_demo;

/*
    2 线程进入无限等待后被唤醒
        注意：等待和唤醒是两个或多个线程之间实现的。进入无限等待的线程是不会自动唤醒，只能通过其他线程来唤醒。


        wait() : 释放锁
        notify : 不释放锁
        notifyAll : 不释放锁

=========================================
        A线程开始执行...
        A线程进入无线等待...

        休眠五秒

        B线程开始执行...
        B线程中使用notify唤醒A线程...
        A线程被唤醒...
=========================================

        A线程开始执行...
        A线程进入无线等待...

        休眠五秒钟

        B线程开始执行...
        B线程中使用notify唤醒A线程...

        休眠五秒钟

        A线程被唤醒...
 */
public class Test2 {
    public static void main(String[] args) throws InterruptedException {
        Object lock = new Object();

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("A线程开始执行...");
                    System.out.println("A线程进入无线等待...");
                    try {
                        lock.wait(); // 释放锁
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("A线程被唤醒...");
                }
            }
        } , "A").start();

        Thread.sleep(5000);

        new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (lock) {
                    System.out.println("B线程开始执行...");
                    System.out.println("B线程中使用notify唤醒A线程...");
                    lock.notify();// 唤醒 , 没有释放锁
                    try {
                        Thread.sleep(5000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }// 释放锁
            }
        } , "B").start();
    }
}